import hashlib
import string

def check_md5_conditions(md5_hash):
    """检查MD5哈希是否满足PHP代码中的所有条件"""
    if len(md5_hash) != 32:
        return False

    # 条件1: 字符相等
    char1 = md5_hash[1]
    char14 = md5_hash[14]
    char17 = md5_hash[17]

    if not (char1 == char14 and char14 == char17):
        return False

    # 条件2: 数学运算
    try:
        int_char1 = int(char1, 16) # 注意：这里如果字符是'a'-'f'，intval()会是0
        int_char14 = int(char14, 16)
        int_char17 = int(char17, 16)
        int_char31 = int(md5_hash[31], 16)

        # PHP的intval()对于非数字字符会返回0，例如 intval('a') == 0
        # 我们的PHP代码中，intval()直接作用于单个字符，如果字符是'a'-'f'，则intval()结果为0
        # 只有字符'1'到'9'才能保证intval()结果非0
        # 并且为了满足 (X+X+X)/X === 3，X不能为0
        if not (char1.isdigit() and int(char1) >= 1 and int(char1) <= 9):
            return False

        # 如果char1是数字字符'1'-'9'，那么intval(char1)就是其本身
        # 故 (intval(char1) + intval(char14) + intval(char17)) / intval(char1)
        # 等价于 (char1_val + char1_val + char1_val) / char1_val = 3
        # 所以条件简化为 intval(char31) === 3
        if not (md5_hash[31].isdigit() and int(md5_hash[31]) == 3):
             return False

        # 最终确认 intval(char1) 不能是 0，并且 intval(char31) 必须是 3
        # 此时 char1 = char14 = char17 且它们必须是 '1'-'9' 中的一个
        # 且 char31 必须是 '3'
        
        # 简化后的条件判断
        if not (int(char1) >= 1 and int(char1) <= 9): # 确保char1是1-9的数字字符
            return False
        
        if not (md5_hash[31] == '3'): # 确保char31是'3'
            return False

    except ValueError: # 如果字符不是有效的16进制数，int()会报错
        return False
    
    return True

found_tokens = []
# 可以尝试的字符集
charset = string.ascii_lowercase + string.ascii_uppercase + string.digits # a-z, A-Z, 0-9

print("开始搜索符合条件的token...")
# 为了效率，我们从较短的字符串开始尝试
# 例如，尝试长度为 1 到 7 的字符串
for length in range(1, 8):
    # 使用itertools.product生成所有可能的字符串组合
    # 暴力破解所有可能的字符串会非常耗时，此处仅作示例
    # 实际破解可能需要更智能的字典或预计算
    import itertools
    for attempt in itertools.product(charset, repeat=length):
        input_string = "".join(attempt)
        md5_result = hashlib.md5(input_string.encode('utf-8')).hexdigest()

        if check_md5_conditions(md5_result):
            # 确认我们找到的是满足所有条件的token
            # 打印并保存
            print(f"找到符合条件的token: '{input_string}' (MD5: {md5_result})")
            found_tokens.append({'token': input_string, 'md5': md5_result})
            if len(found_tokens) >= 2: # 找到两个最优结果即可停止
                break
    if len(found_tokens) >= 2:
        break

if not found_tokens:
    print("未找到符合条件的token。")

print("\n---")
print("以下是根据PHP代码逻辑找到的最优两种结果（随机顺序）：")
for i, result in enumerate(found_tokens[:2]):
    print(f"结果 {i+1}:")
    print(f"  _GET['token'] = '{result['token']}'")
    print(f"  MD5 Hash: {result['md5']}")